package com.jch.po.codec;

import com.jch.po.util.SerializationUtil;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

// 对象解码器
public class ObjDecoder extends ByteToMessageDecoder {

    private Class<?> genericClass;

    public ObjDecoder(Class<?> genericClass) {
        this.genericClass = genericClass;
    }

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {

        if (in.readableBytes() < 4){ // 长度判断是否小于4个字节 | 该四个字节为存储的是消息字节数据组长度
            return;
        }
        in.markReaderIndex(); // 标记读取位置
        // 获取数据长度
        int dataLength = in.readInt();
        // 检查数据长度是否足够一次读取 | 解决半包问题
        if (in.readableBytes() < dataLength) {
            in.resetReaderIndex(); // 重置标记位置
            return;
        }
        // 读取数据
        byte[] data = new byte[dataLength];
        in.readBytes(data); // 读取dataLength长度字节 | 解决粘包问题
        out.add(SerializationUtil.deserialize(data,genericClass)); // 转换为对应class对象，加入到out列表
    }
}
